#include "connect.h"
#include "ui_connect.h"
#include"widget.h"
#include "network.h"
#include "MessageType.h"
#include "tcpsocketsingleton.h"
#include <QVBoxLayout>

Netconnect::Netconnect(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::connect)
{
    ui->setupUi(this);

    this->setWindowTitle("医生端");
    this->setWindowIcon(QIcon(":doctorimg/img/doctorIcon.png"));

    // 设置主窗口背景及控件样式
    this->setStyleSheet(
        "QWidget { background-color: rgba(255, 240, 245, 0.95); }" // 整体背景为浅粉色
        "QLabel { color: #880E4F; font-size: 24px; font-weight: bold; }" // 增大字体为24px
        "QLineEdit { min-height: 40px; background-color: rgba(255, 255, 255, 0.9); "
        "border: 2px solid #F48FB1; padding: 12px; border-radius: 10px; font-size: 20px; color: black; }" // 调整输入框
        "QPushButton { min-width: 100px; min-height: 40px; background-color: #F8BBD0; color: white; border: 2px solid #F48FB1; "
        "padding: 15px 30px; border-radius: 12px; font-size: 22px; font-weight: bold; }" // 按钮背景、字体及大小设置
        "QPushButton:hover { background-color: #F48FB1; }" // 悬停时按钮背景变深粉色
    );

    // 主布局设置
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->setAlignment(Qt::AlignCenter); // 垂直布局居中
    mainLayout->setSpacing(20); // 控件间距

    // 顶部标题部分
    QWidget *titleWidget = new QWidget(this);
    QHBoxLayout *titleLayout = new QHBoxLayout(titleWidget);
    titleLayout->addWidget(ui->label_3, 0, Qt::AlignCenter); // 添加标题标签
    titleLayout->addWidget(ui->quit, 0, Qt::AlignRight); // 添加退出按钮
    mainLayout->addWidget(titleWidget);

    // 聊天列表布局
    ui->listWidget->setMinimumHeight(500); // 设置聊天列表最小高度
    mainLayout->addWidget(ui->listWidget); // 添加聊天列表

    // 添加弹性空间，分隔聊天列表和输入框
    mainLayout->addStretch(); // 添加伸缩空间，使输入框与聊天列表之间有距离

    // 输入框和发送按钮布局
    QHBoxLayout *inputLayout = new QHBoxLayout();
    ui->lineEdit->setFixedHeight(30); // 设置输入框高度
    ui->lineEdit->setMinimumWidth(200); // 设置输入框最小宽度
    inputLayout->addWidget(ui->lineEdit); // 添加输入框
    inputLayout->addWidget(ui->send); // 添加发送按钮
    mainLayout->addLayout(inputLayout); // 将输入布局添加到主布局

    // 添加固定高度的空间，设置输入框与底部的距离
    mainLayout->addSpacing(20); // 在输入框和发送按钮下方添加20像素的固定间距

    // 设置主布局
    this->setLayout(mainLayout);

    // 调整输入框和发送按钮的垂直对齐方式
    ui->lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // 输入框设置为可扩展
    ui->send->setFixedHeight(30); // 确保发送按钮与输入框高度一致

    // 为发送按钮设置快捷键 Enter
    ui->send->setShortcut(Qt::Key_Return);

    // // 创建一个新的socket
    // tcpSocket  = new QTcpSocket;
    // // 和服务器建立连接
    // tcpSocket->connectToHost(QHostAddress("127.0.0.1"), 12345);
    // if (!tcpSocket->waitForConnected()) {
    //     QMessageBox::critical(nullptr, "Server Connection Error", tcpSocket->errorString());
    // }

    // 获取单例socket
    tcpSocket = TcpSocketSingleton::instance().socket();

    messageType = "Communicate_Logic";
    QString text = "您好，请您描述您的症状";
    ui->listWidget->addItem("我发送的: " + text);
    // 向服务器发送信息的请求
    QMap<QString, QString> data;
    QString type = COMMUNICATE;
    QString sender = DOCTORMESSAGE;
    QString accepter = PATIENTMESSAGE;
    data.insert("type", type);
    data.insert("senderType", sender);
    data.insert("target", accepter);
    data.insert("message", text);
    QByteArray senddata = mapToByteArrayCustom(data);
    tcpSocket->write(senddata);


    // 断开之前所有处理函数的连接
    disconnect(tcpSocket, &QTcpSocket::readyRead, nullptr, nullptr);
    tcpSocket->flush();

    // 连接信号槽，处理服务器的响应
    connect(tcpSocket, &QTcpSocket::readyRead, this, &Netconnect::handleResponse);

    // connect(tcpSocket, &QTcpSocket::readyRead, this, [ = ]() {
    //     if (messageType == "Communicate_Logic") {
    //         // 处理登陆逻辑
    //         qDebug() << "处理来自患者的消息响应";
    //         QByteArray responseData = tcpSocket->readAll();
    //         QMap<QString, QString> response = byteArrayToMapCustom(responseData);
    //         // 获取医生的回复并显示在界面
    //         QString responseText = response.value("message");
    //         if (!responseText.isEmpty()) {
    //             ui->listWidget->addItem("患者: " + responseText);
    //         } else {
    //             QMessageBox::warning(this, "患者", "未收到来自患者的回复");
    //         }
    //     }

    //     // qDebug() << "处理来自患者的消息响应";
    //     // QByteArray responseData = tcpSocket->readAll();
    //     // QMap<QString, QString> response = byteArrayToMapCustom(responseData);
    //     // // 获取医生的回复并显示
    //     // QString responseText = response.value("message");
    //     // if (!responseText.isEmpty()) {
    //     //     ui->listWidget->addItem("患者: " + responseText);
    //     // } else {
    //     //     QMessageBox::warning(this, "患者", "未收到来自患者的回复");
    //     // }
    // });

}

Netconnect::~Netconnect()
{
    delete ui;
}

void Netconnect::handleResponse()
{
    if (messageType == "Communicate_Logic") {
        qDebug() << "处理来自患者的消息响应";
        QByteArray responseData = tcpSocket->readAll();
        QMap<QString, QString> response = byteArrayToMapCustom(responseData);
        // 获取医生的回复并显示
        QString responseText = response.value("message");
        if (!responseText.isEmpty()) {
            ui->listWidget->addItem("患者: " + responseText);
        } else {
            QMessageBox::warning(this, "患者", "未收到来自患者的回复");
        }
    }
}

void Netconnect::on_quit_clicked()
{
    this->close();
    // Widget b;
    // b.show();
}

void Netconnect::on_send_clicked()
{
    if (tcpSocket->state() == QAbstractSocket::UnconnectedState) {
        tcpSocket->connectToHost(ServerIP, ServerPort);
    }

    // messageType = "Communicate_Logic";

    QString text = ui->lineEdit->text();
    ui->listWidget->addItem("我发送的: " + text);
    // 向服务器发送信息的请求
    QMap<QString, QString> data;
    QString type = COMMUNICATE;
    QString sender = DOCTORMESSAGE;
    QString accepter = PATIENTMESSAGE;
    data.insert("type", type);
    data.insert("senderType", sender);
    data.insert("target", accepter);
    data.insert("message", text);
    QByteArray senddata = mapToByteArrayCustom(data);
    tcpSocket->write(senddata);

    if (tcpSocket->state() == QAbstractSocket::UnconnectedState) {
        tcpSocket->connectToHost(ServerIP, ServerPort);
    }

    ui->lineEdit->clear();
}

